/**
 * 数据库记录类型定义
 *
 * @fileoverview 定义数据库表对应的TypeScript类型接口，确保数据库操作的类型安全。
 * 包含预约记录、批量用户、批次管理、操作日志等核心数据实体的完整定义。
 *
 * 主要类型：
 * - AppointmentRecord - 预约记录主表
 * - BatchUserRecord - 批量用户数据
 * - BatchRecord - 批次记录
 * - OperationLogRecord - 操作日志
 * - PlaceholderRecord - 占位数据记录
 * - ConfigRecord - 配置记录
 *
 * @author System
 * @version 1.0.0
 * @since 2024
 */

/**
 * 预约记录数据库实体
 *
 * @description 对应数据库中的预约记录表，包含完整的预约信息和状态管理字段。
 *
 * @interface AppointmentRecord
 */
export interface AppointmentRecord {
  /** 记录ID，主键 */
  id: number
  /** 序列号，系统生成 */
  sequence_number: string
  /** 护照号码 */
  passport_number: string
  /** 驾照号码 */
  license_number: string
  /** 申请人姓名 */
  full_name: string
  /** 邮箱地址 */
  email: string
  /** 联系电话（可选） */
  phone_number?: string
  /** 签发国家 */
  issuing_country: string
  /** 签发机关 */
  issuing_authority: string
  /** 服务类型 */
  service_type: string
  /** 首选日期，JSON数组字符串 */
  preferred_dates?: string
  /** 首选时间，JSON数组字符串 */
  preferred_times?: string
  /** 优先级（1-5） */
  priority: number
  /** 备注信息（可选） */
  remarks?: string
  /** 是否为占位数据 */
  is_placeholder: boolean
  /** 是否为监控数据 */
  is_monitor: boolean

  // 预约状态相关字段
  /** 预约状态 */
  appointment_status: 'pending' | 'booked' | 'confirmed' | 'cancelled' | 'failed'
  /** 预约参考号（预约成功后生成） */
  reference_number?: string
  /** 预约日期，格式：DD-MM-YYYY */
  appointment_date?: string
  /** 预约时间，格式：HH:MM-HH:MM */
  appointment_time?: string
  /** 时间段ID */
  timeslot_id?: string
  /** 办公地点代码 */
  office_code: string

  // 系统管理字段
  /** 批次ID（批量处理时使用） */
  batch_id?: string
  /** 作业ID（自动化处理时使用） */
  job_id?: string
  /** 预约模式 */
  booking_mode: 'manual' | 'quick' | 'batch' | 'auto'
  /** 错误消息（失败时记录） */
  error_message?: string
  /** 原始响应数据 */
  raw_response?: string
  /** 重试次数 */
  retry_count: number
  /** 创建时间 */
  created_at: Date
  /** 更新时间 */
  updated_at: Date
  /** 预约成功时间（可选） */
  booked_at?: Date
}

/**
 * 批量用户记录数据库实体
 *
 * @description 对应批量处理中的用户数据表。
 *
 * @interface BatchUserRecord
 */
export interface BatchUserRecord {
  /** 用户ID，主键 */
  id: string
  /** 护照号码 */
  passport_number: string
  /** 驾照号码 */
  license_number: string
  /** 驾照持有人姓名 */
  license_owner_name: string
  /** 邮箱地址 */
  email: string
  /** 联系电话（可选） */
  phone_number?: string
  /** 签发国家 */
  issuing_country: string
  /** 签发机关 */
  issuing_authority: string
  /** 服务类型 */
  service_type: string
  /** 首选日期，JSON数组字符串 */
  preferred_dates?: string
  /** 首选时间，JSON数组字符串 */
  preferred_times?: string
  /** 优先级 */
  priority: number
  /** 处理状态 */
  status: 'pending' | 'processing' | 'success' | 'failed' | 'cancelled'
  /** 批次ID */
  batch_id?: string
  /** 关联的预约记录ID */
  appointment_id?: number
  /** 错误消息 */
  error_message?: string
  /** 重试次数 */
  retry_count: number
  /** 创建时间戳 */
  created_at: number
  /** 更新时间戳 */
  updated_at: number
  /** 处理时间戳（可选） */
  processed_at?: number
}

/** 可用性缓存记录 */
export interface AvailabilityCacheRecord {
  /** 缓存ID */
  id: number
  /** 缓存键 */
  cache_key: string
  /** 服务类型 */
  service_type: string
  office_code: string
  date: string // DD-MM-YYYY
  available_timeslots: string // JSON数组字符串
  last_updated: number
  expires_at: number
  source: 'api' | 'manual'
}

/** 作业记录 */
export interface JobRecord {
  id: string
  type: 'script' | 'batch' | 'monitor'
  mode?: string
  status: 'pending' | 'running' | 'success' | 'failed' | 'cancelled'
  progress: number
  current_step?: string
  user_info?: string // JSON字符串
  options?: string // JSON字符串
  result?: string // JSON字符串
  error_message?: string
  trace_id?: string
  created_at: number
  started_at?: number
  completed_at?: number
}

/** 系统配置记录 */
export interface SystemConfigRecord {
  key: string
  value: string // JSON格式
  description?: string
  category: string
  is_sensitive: boolean
  created_at: number
  updated_at: number
}

/** 操作日志记录 */
export interface OperationLogRecord {
  id: number
  timestamp: number
  level: string
  source: string
  operation: string
  message: string
  data?: string // JSON字符串
  user_info?: string // 脱敏的用户信息
  trace_id?: string
  job_id?: string
}

// 数据访问接口（DAL）
/** 预约记录仓储接口 */
export interface IAppointmentRepository {
  create: (appointment: Omit<AppointmentRecord, 'id' | 'created_at' | 'updated_at'>) => Promise<AppointmentRecord>
  findById: (id: number) => Promise<AppointmentRecord | null>
  findByReference: (referenceNumber: string) => Promise<AppointmentRecord | null>
  findByUser: (passport: string, license: string) => Promise<AppointmentRecord[]>
  update: (id: number, updates: Partial<AppointmentRecord>) => Promise<AppointmentRecord>
  delete: (id: number) => Promise<boolean>
  list: (filters?: any, pagination?: any) => Promise<{ appointments: AppointmentRecord[], total: number }>
  export: (format: 'csv' | 'xlsx', filters?: any) => Promise<string>
}

/** 批量用户仓储接口 */
export interface IBatchUserRepository {
  create: (user: Omit<BatchUserRecord, 'created_at' | 'updated_at'>) => Promise<BatchUserRecord>
  findById: (id: string) => Promise<BatchUserRecord | null>
  findByBatch: (batchId: string) => Promise<BatchUserRecord[]>
  update: (id: string, updates: Partial<BatchUserRecord>) => Promise<BatchUserRecord>
  delete: (id: string) => Promise<boolean>
  bulkInsert: (users: Omit<BatchUserRecord, 'id' | 'created_at' | 'updated_at'>[]) => Promise<BatchUserRecord[]>
  getByPriority: (batchId?: string) => Promise<BatchUserRecord[]>
}

/** 可用性缓存接口 */
export interface IAvailabilityCache {
  get: (key: string) => Promise<AvailabilityCacheRecord | null>
  set: (key: string, data: Omit<AvailabilityCacheRecord, 'id' | 'cache_key'>) => Promise<void>
  delete: (key: string) => Promise<boolean>
  cleanup: () => Promise<number> // 清理过期缓存，返回清理数量
}

export interface IJobRepository {
  create: (job: Omit<JobRecord, 'created_at'>) => Promise<JobRecord>
  findById: (id: string) => Promise<JobRecord | null>
  update: (id: string, updates: Partial<JobRecord>) => Promise<JobRecord>
  delete: (id: string) => Promise<boolean>
  list: (filters?: any) => Promise<JobRecord[]>
}

export interface ISystemConfigRepository {
  get: (key: string) => Promise<SystemConfigRecord | null>
  set: (key: string, value: any, description?: string, category?: string, isSensitive?: boolean) => Promise<void>
  delete: (key: string) => Promise<boolean>
  getByCategory: (category: string) => Promise<SystemConfigRecord[]>
  getAll: () => Promise<SystemConfigRecord[]>
}

export interface IOperationLogRepository {
  create: (log: Omit<OperationLogRecord, 'id'>) => Promise<OperationLogRecord>
  list: (filters?: any, pagination?: any) => Promise<{ logs: OperationLogRecord[], total: number }>
  cleanup: (olderThanDays: number) => Promise<number>
}
